package com.such.kit.calendar.period;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import com.such.kit.datacast.CastCommons;

/**
 * @作者 SUCH
 * @日期 2017-2-17 下午7:17:45
 * @描述 计算日期频度
 */
public abstract class DatePeriod {

	protected SimpleDateFormat baseSfd = CastCommons.getSimpleDateFormat(CastCommons.DATE);
	protected String format;
	protected SimpleDateFormat sfd;
	protected Date date;
	protected String dateString;
	protected Calendar calendar;

	/**
	 * <p>方法名：init</p>
	 * <p>描述：初始化对象</p>
	 * @param date Date 类型时间
	 * @param format 日期格式
	 * @throws ParseException
	 */
	public void init(Date date, String format) throws ParseException {
		this.format = format;
		this.sfd = CastCommons.getSimpleDateFormat(format);
		this.date = date;
		this.dateString = sfd.format(date);
		this.calendar = Calendar.getInstance();
		this.calendar.setTime(this.date);
	}

	/**
	 * <p>方法名：init</p>
	 * <p>描述：初始化对象</p>
	 * @param date 字符串类型时间
	 * @param format 日期格式
	 * @throws ParseException
	 */
	public void init(String date, String format) throws ParseException {
		this.format = format;
		this.sfd = CastCommons.getSimpleDateFormat(format);
		this.date = sfd.parse(date);
		this.dateString = date;
		this.calendar = Calendar.getInstance();
		this.calendar.setTime(this.date);
	}

	/**
	 * <p>方法名：next</p>
	 * <p>描述：获取下一个日期频度</p>
	 * @return 下一个日期频度
	 * @throws ParseException
	 */
	public DatePeriod next() throws ParseException {
		return add(1);
	}
	
	/**
	 * <p>方法名：prev</p>
	 * <p>描述：获取上一个日期频度</p>
	 * @return 上一个日期频度
	 * @throws ParseException
	 */
	public DatePeriod prev() throws ParseException {
		return subtract(1);
	}

	/**
	 * <p>方法名：getDate</p>
	 * <p>描述：获取 Date 类型当前日期</p>
	 * @return Date 类型当前日期
	 */
	public Date getDate() {
		return this.date;
	}

	/**
	 * <p>方法名：getDateString</p>
	 * <p>描述：获取字符串类型当前日期</p>
	 * @return 字符串类型当前日期
	 */
	public String getDateString() {
		return this.dateString;
	}

	/**
	 * <p>方法名：add</p>
	 * <p>描述：获取指定数量个后日期频度</p>
	 * @param amount 指定数量
	 * @return 指定数量个后日期频度
	 * @throws ParseException
	 */
	public abstract DatePeriod add(int amount) throws ParseException;

	/**
	 * <p>方法名：subtract</p>
	 * <p>描述：获取指定数量个前日期频度</p>
	 * @param amount 指定数量
	 * @return 指定数量个前日期频度
	 * @throws ParseException
	 */
	public abstract DatePeriod subtract(int amount) throws ParseException;

	/**
	 * <p>方法名：firstFreqDay</p>
	 * <p>描述：获取日期频度第一天</p>
	 * @return 日期频度第一天
	 */
	public abstract String firstFreqDay();
	
	/**
	 * <p>方法名：lastFreqDay</p>
	 * <p>描述：获取日期频度最后一天</p>
	 * @return 日期频度最后一天
	 */
	public abstract String lastFreqDay();

}
